package cn.itcast.oa.service.impl;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.oa.base.DaoSupportImpl;
import cn.itcast.oa.domain.Forum;
import cn.itcast.oa.service.ForumService;

@Service
@Transactional
@SuppressWarnings("unchecked")
public class ForumServiceImpl extends DaoSupportImpl<Forum> implements ForumService {

	/**
	 * 重写findAll()方法，添加排序方法
	 */
	public List<Forum> findAll() {
		return getSession().createQuery(//
				"FROM Forum f ORDER BY f.position")//
				.list();
	}

	/**
	 * 重写保存方法，把id添加到位置 以保证position的唯一性
	 */
	public void save(Forum forum) {
		super.save(forum);
		forum.setPosition(forum.getId().intValue());
		// 更新到数据库中
		// 现在对象是持久化状态，可不写
		// getSession().update(forum);
		
	}

	public void moveUp(Long id) {
		// 找出相关Forum
		Forum forum = getById(id); // 要移动的Forum

		// 把要移动的Forum上面所有的Forum查询出来，然后按照倒序的方式排序
		// 去第一页的第一条数据就是该Forum上面的一条(该Forum的position的值是比要移动的Forum的position小，且最接近要移动Forum的)
		Forum other = (Forum) getSession().createQuery(//
				"FROM Forum f WHERE f.position < ? ORDER BY f.position DESC")//
				.setParameter(0, forum.getPosition())//
				.setFirstResult(0)//
				.setMaxResults(1)//
				.uniqueResult(); // 要移动的上一个Forum

		// 如果没有上一个 则表示已经是第一个，直接返回
		if (other == null) {
			return;
		}

		// 两个交换position的值
		int temp = forum.getPosition();
		forum.setPosition(other.getPosition());
		other.setPosition(temp);

		// 更新到数据库中
		// 现在对象是持久化状态，可不写
		// getSession().update(forum);
		// getSession().update(other);

	}

	@Override
	public void moveDown(Long id) {
		// 找出相关Forum
		Forum forum = getById(id); // 要移动的Forum

		// 把要移动的Forum上面所有的Forum查询出来，然后按照升序的方式排序
		// 取第一页的第一条数据就是该Forum上面的一条(该Forum的position的值是比要移动的Forum的position大，且最接近要移动Forum的)
		Forum other = (Forum) getSession().createQuery(//
				"FROM Forum f WHERE f.position > ? ORDER BY f.position ASC")//
				.setParameter(0, forum.getPosition())//
				.setFirstResult(0)//
				.setMaxResults(1)//
				.uniqueResult(); // 要移动的下一个Forum

		// 如果没有下一个 则表示已经是最后一个，直接返回
		if (other == null) {
			return;
		}

		// 两个交换position的值
		int temp = forum.getPosition();
		forum.setPosition(other.getPosition());
		other.setPosition(temp);

		// 更新到数据库中
		// 现在对象是持久化状态，可不写
		// getSession().update(forum);
		// getSession().update(other);

	}

}
